package netty.udp.demo5;

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOption;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.epoll.Epoll;
import io.netty.channel.epoll.EpollChannelOption;
import io.netty.channel.epoll.EpollDatagramChannel;
import io.netty.channel.epoll.EpollEventLoopGroup;
import io.netty.channel.socket.DatagramPacket;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * @program netty-demo
 * @description:
 * @author: zhanglu
 * @create: 2020-07-03 13:21:00
 */
@Component
public class UdpServer {

    @PostConstruct
    public void init(){
        try {
            Bootstrap b = new Bootstrap();
            int cpuNum = Runtime.getRuntime().availableProcessors();
            System.out.println("cpu:" + cpuNum);
            EpollEventLoopGroup group = new EpollEventLoopGroup();
            b.group(group)
                    .channel(EpollDatagramChannel.class)
                    .option(ChannelOption.SO_BROADCAST, true)
                    .handler(new UdpServerHandler());
            // linux平台下支持SO_REUSEPORT特性以提高性能
            if (Epoll.isAvailable()) {
                b.option(EpollChannelOption.SO_REUSEPORT, true);
            }
            System.out.println(0);
            b.bind(2555).sync().channel().closeFuture();
            System.out.println(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    private static class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {

        @Override
        protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
            System.out.println(2);
            ByteBuf buf = packet.copy().content();
            byte[] req = new byte[buf.readableBytes()];
            buf.readBytes(req);
            String body = new String(req, "UTF-8");
            System.out.println(body);//打印收到的信息
            //向客户端发送消息
            String json = "来自服务端: 南无阿弥陀佛";
            // 由于数据报的数据是以字符数组传的形式存储的，所以传转数据
            byte[] bytes = json.getBytes("UTF-8");
            DatagramPacket data = new DatagramPacket(Unpooled.copiedBuffer(bytes), packet.sender());
            ctx.writeAndFlush(data);//向客户端发送消息
            System.out.println(3);
        }
    }


}
